package com.sjlh.centurylianhua.utils;

import io.jsonwebtoken.*;

import java.util.Date;
import java.util.UUID;

public class JwtUtils {
    //7天过期
    private static long expire = 3600 * 1000;//一个小时3600 * 1000
    //32位秘钥
    private static String secret = "abcdfghiabcdfghiabcdfghiabcdfghi";

    // 签名信息(密钥)
    private static String signature = "admin";

    /**通过用户名获取token
     * @param username 用户名
     * @return
     */
    public static String getToken(String account) {
        //获取到JWT的builder,builder就是用来获取JWT的对象
        JwtBuilder jwtBuilder = Jwts.builder();
        String jwtToken = jwtBuilder
                // 设置头信息Header，头部
                // 设置Token类型
                .setHeaderParam("typ","JWT")
                // 设置算法名称
                .setHeaderParam("alg","HS256")
                // 设置载荷Payload，存放有效信息的地方
                // 用户名
                .claim("account",account)
                // 设置主题
                .setSubject(account)
                // 获取有效时间
                .setExpiration(new Date(System.currentTimeMillis()+expire))
                // 设置ID，就是JWT的ID
                .setId(UUID.randomUUID().toString())
                // 设置签名signature，对前面两部分的再次加密编码整合
                .signWith(SignatureAlgorithm.HS256,signature)
                // 将三部分进行拼接，形成有效的Token
                .compact();
        return jwtToken;
    }

    //生成token
    public static String generateToken(String username){
        Date now = new Date();
        Date expiration = new Date(now.getTime() + 1000 * expire);
        return Jwts.builder()
                .setHeaderParam("type","JWT")
                .setSubject(username)
                .setIssuedAt(now)
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS512,secret)
                .compact();
    }

    //解析token
    public static Claims getClaimsByToken(String token){
        return Jwts.parser()
                    .setSigningKey(secret)
                    .parseClaimsJws(token)
                    .getBody();

    }
    /**
     * 对Token进行解密
     * @param token
     * @return
     */
    public static Claims parseToken(String token){
        // 运用Jwts.parser()对象
        JwtParser jwtParser = Jwts.parser();
        // 运用signature进行解密，拿到类似集合的返回对象
        Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        return claims;
        /*
         * System.out.println(claims.get("username"));
         * System.out.println(claims.get("role")); System.out.println(claims.getId());
         * System.out.println(claims.getSubject());
         * System.out.println(claims.getExpiration());
         */
    }
}
